
// 聚合函数

function f1(arg) {
	console.log('f1', arg)
	return arg + 'f1'
}

function f2(arg) {
	console.log('f2', arg)
	return arg + 'f2'
}

function f3(arg) {
	console.log('f3', arg)
	return arg + 'f3'
}

function compose(...funcs) {

	// return funcs.reduce((a,b) => (...args) => a(b(...args)))
	const len = funcs.length;
	if (len === 0) {
		return args => args;
	}
	if (len === 1) {
		return funcs[0];
	}

	return funcs.reduce((a,b) => {
		// 每次a都返回一个函数，函数的return的值，是上一个函数return的值，传入到下一个函数返回的新值
		return (...args) => {
			return a(b(...args)) // 这里返回的，其实是一个值
		}
	})
}

// const newFunc = compose(f1, f2 ,f3)

// newFunc('msg')

// console.log(newFunc('msg')) // ===> f1(f2(f3('msg')))


